/*
 * Copyright (C) 2025 Tsingteng MicroSystem
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
/**
 * @file nfa_dm.h
 * @brief NFC设备管理模块API定义
 */

#ifndef _NFA_DM_H_
#define _NFA_DM_H_

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

#include "nfa_base.h"
#include "nci_cfg.h"

/**
 * @brief 打开NCI协议栈
 *
 * @return 成功返回NCI_STATUS_OK，失败返回其他错误码
 */
tNCI_STATUS nfa_enable(const tNCI_INIT_CFG *p_cfg);
/**
 * @brief 关闭NCI协议栈
 *
 * @param is_shutdown 是否进入关机模式，true为关机模式，false为正常关闭
 *
 * @note 关机模式不会向NFCC设置RF状态和NFCEE状态，但会关闭所有模块
 *
 * @return NCI_STATUS_OK 关闭成功，其他值表示关闭失败
 */
tNCI_STATUS nfa_disable(bool is_shutdown);

/**
 * @brief 设置屏幕状态
 *
 * @param screen_state_mask 屏幕状态掩码
 * @param always_poll 是否始终打开Polling
 *
 * @return 成功返回NCI_STATUS_OK，失败返回其他错误码
 */
tNCI_STATUS nfa_set_screen_state(uint8_t screen_state_mask, bool always_poll);

/**
 * @brief Dump协议栈的状态并写入文件
 *
 * @param fd 保存Dump信息文件的文件描述符
 */
void nfa_dump(int fd);
/**
 * @brief 检查NFCC固件升级
 *
 * @return 成功返回NCI_STATUS_OK，失败返回其他错误码
 */
tNCI_STATUS nfa_check_firmware();
/**
 * @brief 执行恢复出厂设置
 *
 * @return 成功返回NCI_STATUS_OK，失败返回其他错误码
 */
tNCI_STATUS nfa_factory_reset();
/**
 * @brief 获取NCI版本号
 *
 * @return 返回NCI版本号
 */
tNCI_VERSION nfa_get_nci_version();
/**
 * @brief 获取MW软件版本号
 *
 * @return 返回软件版本号
 */
uint32_t nfa_get_sw_version();
/**
 * @brief 获取当前开启的NCI_FEATURE
 * @return 返回当前开启的NCI_FEATURE
 */
uint32_t nfa_get_nci_feature();
/**
 * @brief 获取NFCC厂商信息
 *
 * @param[out] p_rsp 返回的厂商信息
 * @note 当返回状态为NCI_STATUS_OK时，p_rsp有效
 * @note p_rsp需要调用nfa_utils_free_rsp释放
 *
 * @return 成功返回NCI_STATUS_OK，失败返回其他错误码
 */
tNCI_STATUS nfa_get_manuf_spec_info(tNCI_RSP *p_rsp);
/**
 * @brief 获取协议栈编译时间
 *
 * @param[out] build_time 保存编译时间的字符串
 * @param[in] len 保存编译时间的字符串长度，必须大于12
 *
 * @return 成功返回NCI_STATUS_OK，失败返回其他错误码
 */
tNCI_STATUS nfa_get_build_time(char *build_time, uint8_t len);

/**
 * @brief 设置DTA模式开关
 * @param enable true为开启DTA模式，false为关闭DTA模式
 */
void nfa_dm_set_dta_mode(bool enable);
/**
 * @brief 注入NTF消息并让协议栈处理
 *
 * @param p_ntf NTF消息数据，完整NCI指令：[HDR0][HDR1][LEN][DATA]
 * @param ntf_len NTF消息数据长度，即p_ntf的长度
 * @param delay_ms 设置延迟发送时间，单位ms，立即发送设置为0
 *
 * @return 写入成功返回NCI_STATUS_OK，否则返回错误码
 */
tNCI_STATUS nfa_dm_inject_ntf(uint8_t *p_ntf, uint16_t ntf_len, uint32_t delay_ms);

#ifdef __cplusplus
}
#endif /* __cplusplus */

#endif /* _NFA_DM_H_ */
